#ifndef CONNECTION_H_
#define CONNECTION_H_

#include "Thread.h"
#include "Socket.h"
#include "Mutex.h"
#include "../modelo/Juego.h"
#include "../modelo/Personaje.h"
#include "../constantes.h"
#include "../modelo/util/LoggerConsola.h"
#include "../modelo/ataque/Espada.h"
#include "../modelo/ataque/Bomba.h"
#include "../modelo/ataque/HechizoHielo.h"
#include <map>

class Server;

class Connection: public Thread {
protected:
	virtual void run();
private:
	Personaje* personaje;
	bool working;
	Mutex workingMutex;
	Socket aSocket;
	Mutex mutexInactivos;
	Server* server;
	Mutex* escenarioMutex;
	string nombrePersonaje;
	int clientesActivos;
	map<string,Arma*> armas;
	LoggerConsola logger;

	void setWorking(bool working);
	vector<string> parsearString(string data);
	void waitForStart();

	bool sendGameInfo();

	bool actualizarEstadoTeclas();

	string getOtroPersonaje();

	bool sendOtroPersonaje();

	void quitoPersonaje();

	int verificarNombrePersonaje(string nombrePersonaje);

	Personaje* devolverProtagonistaInicial(string nombrePersonaje,string tipoEntidad);

	string devolverPersonajesEscenario(string nombreProtagonista);

	string devolverPersonajesEscenarioUpdate(string nombreProtagonista);

	bool actualizarProtagonista(string protagonistaActualizar);

	string obtenerPosicionesVisitadas(string nombreProtagonista);

	void agregarPosicionVisitada(string nombreProtagonista,int x, int y);

	bool actualizarAtacar(string eventosAtacar);

	string armarEntidadesYPersonajesAtacados();

	string devolverBonusEscenario();

	bool trabajando;


public:
	Connection( unsigned int sockfd ) : aSocket(sockfd) {trabajando = true; clientesActivos = 0; personaje = NULL; server = NULL; working = false;escenarioMutex=NULL;};

	Connection( unsigned int sockfd, Juego *j, int ce, Server *sr,Mutex*escMutex) :
		aSocket(sockfd), server(sr) {trabajando = true;working = false; personaje = NULL; clientesActivos = ce;escenarioMutex=escMutex;};

	virtual ~Connection() {};

	bool isWorking();

	//Cierra la conexion
	void connectionShutdown();

	int sendData(string data);

	string recvData();

	Personaje* getPersonaje() {return personaje;};

	void unlockEscenario();

	void setTrabajando(bool trab);


};

#endif

